package com.cskaoyan.javase.oop1._13block._3static.classload;

/**
 * 读程序题
 *
 * @since 16:49
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    static {
        System.out.println("Demo2类开始初始化步骤了!");
    }

    static Cat cat = new Cat();
    static {
        System.out.println("Demo2类完成初始化步骤了!");
    }

    /*
        在初始化类Dog的时候需要创建Demo2对象
        成员变量的显式赋值需要创建Dog对象
        这时
            Dog类已经完成加载和连接了
            而且已经开始初始化了
        这里创建Dog对象是可以的,而且不会触发Dog类的初始化

        所以这里直接创建Dog对象即可
     */
    Dog dog = new Dog();

    // 不要忘记启动main方法,触发该类的类加载
    // 类加载过程中需要完成静态成员变量的初始化和赋值
    public static void main(String[] args) {
        System.out.println("hello world!");
        Demo2 d = new Demo2();
    }

    public Demo2() {
        System.out.println("demo2");
    }
}

class Cat {
    static {
        System.out.println("Cat类开始初始化步骤了!");
    }

    static Dog dog = new Dog();
    static {
        System.out.println("Cat类完成初始化步骤了!");
    }

    public Cat() {
        System.out.println("cat");
    }
}

class Dog {
    /*
        此时Demo类已经完成加载和连接
        正在初始化的过程中
        这时创建它的对象,已经可以了
        而且也不会再次触发它的初始化了
        于是这里直接找构造器创建对象即可

        创建Demo2类对象完毕,就算初始化类Dog结束
     */
    static {
        System.out.println("Dog类开始初始化步骤了!");
    }

    static Demo2 demo = new Demo2();

    static {
        System.out.println("Dog类完成初始化步骤了!");
    }

    public Dog() {
        System.out.println("dog");
    }
}
